/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gradius.InterfaceGrafica;

import gradius.Elementos.Naves.Vicviper;
import gradius.Util.MP3Player;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javazoom.jl.decoder.JavaLayerException;

/** Classe que contém o painel de conteudo da janela de GameOver
 *
 * @author Eduardo
 */
public class GameOver extends JPanel
{
    private Image fundo;
    private ArrayList<String> ranking;
    private JTextField nome;
    private JButton salvar;
    private JButton showranking;
    private JButton menu;
    private JPanel painel;
    private Vicviper jogador;
    private Janela4 frame;
    private MP3Player p1 = new MP3Player();
    private int stage;

    /** Construtor da classe GameOver
     *
     * @param j - Referencia para o objeto que armazena as informações da nave do jogador
     * @param frame - Referencia para o Frame que contem esse painel
     */
    public GameOver(Vicviper j, Janela4 frame, int stage)
    {
        this.stage=stage;
        if((stage == 4)&&(j.getVidaNave()>0))
        {
            try
            {
                p1.play("sounds/sound5.mp3");
            }
            catch (JavaLayerException ex)
            {
                Logger.getLogger(GameOver.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        this.frame = frame;
        this.jogador = j;
        this.setLayout(new BorderLayout());
        painel = new JPanel(new FlowLayout());
        showranking = new JButton("Ranking");
        menu = new JButton("Menu");
        nome = new JTextField("Digite seu nome aqui");
        salvar = new JButton("Salvar");
        ranking = new ArrayList<String>();
        String caminho = "/images/backgrounds/gameover.png";
        URL url = GameOver.class.getResource(caminho);
        fundo = Toolkit.getDefaultToolkit().getImage(url);
        caminho = "/ranking/ranking.txt";
        url = GameOver.class.getResource(caminho);
        FileReader reader = null;
        try
        {
            reader = new FileReader(new File(url.getPath()));
        } 
        catch (FileNotFoundException ex)
        {
            Logger.getLogger(Ranking.class.getName()).log(Level.SEVERE, null, ex);
        }
        BufferedReader breader = new BufferedReader(reader);
        String linha;
        for (int i = 0 ; i<5 ; i++)
        {
            try
            {
                linha = breader.readLine();
                ranking.add(linha);
            } 
            catch (IOException ex)
            {
                Logger.getLogger(Ranking.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        StringTokenizer st = new StringTokenizer(ranking.get(4)," ");
        String a = st.nextToken();
        a = st.nextToken();
        if (j.getScore() > Integer.parseInt(a))
        {
            painel.add(nome);
            painel.add(salvar);
            salvar.addActionListener(new OuvinteSalvar(salvar));
        }
        painel.add(showranking);
        showranking.addActionListener(new OuvinteRanking());
        menu.addActionListener(new OuvinteBotaoSair());
        painel.add(menu);
        painel.setOpaque(false);
        this.add(painel,BorderLayout.SOUTH);
        try
        {
            breader.close();
            reader.close();
        } catch (IOException ex) {
            Logger.getLogger(Ranking.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /** Método que desenha todos os elementos do painel
     *
     * @param g - Objeto de desenho Graphics
     */
    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.drawImage(fundo, 0, 0, this);
    }

    /** Classe Ouvinte do envento de clique de botão de Salvar
     *
     */
    public class OuvinteSalvar implements ActionListener
    {
        private JButton b;

        /** Construtor da classe OuvinteSalvar
         *
         * @param b - Botão de salvar (Referência usada para desativar o botão)
         */
        public OuvinteSalvar(JButton b)
        {
            this.b = b;
        }

        /** Método responsavel pela resposta ao evento de clique selecionado
         *
         * @param e - Objeto do evento capturado no clique do botão
         */
        public void actionPerformed(ActionEvent e)
        {
            for (int i = 0; i<ranking.size() ; i++)
            {
                StringTokenizer st = new StringTokenizer(ranking.get(i)," ");
                String a = st.nextToken();
                a = st.nextToken();
                if (jogador.getScore() > Integer.parseInt(a))
                {
                    ranking.add(i, nome.getText() + " "  + jogador.getScore());
                    break;
                }
            }
            String caminho = "/ranking/ranking.txt";
            URL url = GameOver.class.getResource(caminho);
            FileWriter writer = null;
            try
            {
                writer = new FileWriter(new File(url.getPath()));
            }
            catch (IOException ex)
            {
                Logger.getLogger(GameOver.class.getName()).log(Level.SEVERE, null, ex);
            }
            BufferedWriter bwriter = new BufferedWriter(writer);
            for (int i = 0 ; i<5 ; i++)
            {
                try
                {
                    bwriter.write(ranking.get(i) + "\r\n");
                }
                catch (IOException ex)
                {
                    Logger.getLogger(GameOver.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            try
            {
                bwriter.close();
                writer.close();
            }
            catch (IOException ex)
            {
                Logger.getLogger(GameOver.class.getName()).log(Level.SEVERE, null, ex);
            }
            b.setEnabled(false);
        }
    }

    /** Classe Ouvinte do envento de clique de botão de Ranking da tela de GameOver
     *
     */
    private class OuvinteRanking implements ActionListener
    {
        /** Método responsavel pela resposta ao evento de clique selecionado
         *
         * @param e - Objeto do evento capturado no clique do botão
         */
        public void actionPerformed(ActionEvent e)
        {
           Janela3 j = new  Janela3();
        }
    }

    /** Classe Ouvinte do evento de clique de botão de Sair
     *
     */
    public class OuvinteBotaoSair implements ActionListener
    {
        /** Método responsavel pela resposta ao evento de clique selecionado
         *
         * @param e - Objeto do evento capturado no clique do botão
         */
        public void actionPerformed(ActionEvent e)
        {
            if((stage == 4)&&(jogador.getVidaNave()>0))
            {
                p1.stop();
            }
            try {
                Menu m = new Menu();
                frame.dispose();
            } catch (FileNotFoundException ex) {
                Logger.getLogger(GameOver.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(GameOver.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }
}
